home *** CD-ROM | disk | FTP | other *** search
- // Doggie-Style Windows written by Mark Johns and Justin Lee
- // Extensive help from Mr. George Warner
- // Original base patch Source Code generated by PatchMaker 1.0
- // due to a sick idea by Paul Baxter
-
- #if TARGET_CPU_68K && !TARGET_RT_MAC_CFM
- #error Sorry Can't do that
- #endif
-
- #include <MixedMode.h>
- #include <Appearance.h>
- #include <SpeechSynthesis.h>
- #include <LowMem.h>
- #include <stdlib.h>
- //#include <A4Stuff.h> // Where is this?
-
- #include "ShowInitIcon.h"
-
- // This seems to replace A4Stuff.h
- #ifndef powerc
-
- #define EnterCodeResource() long oldA4 = SetCurrentA4()
- #define ExitCodeResource() SetA4(oldA4)
- long SetCurrentA4(void);
- long SetA4(long:__D0):__D0 = 0xC18C;
- long GetCurrentA4(void) = 0x200C;
- pascal void UnloadA4Seg(void *);
-
- #else
-
- #define EnterCodeResource()
- #define ExitCodeResource()
- #define SetCurrentA4() 0L
- #define SetA4(x) 0L
- #define GetCurrentA4() 0L
- #define UnloadA4Seg(x) 0
-
- #endif
-
- // Our badass constants.
- #define kSwell 14
- #define kVOffset 7
- #define kHOffset 7
-
- #define Rand(min, max) (((rand() & 0x7FFF) % ((max)-(min)+1)) + (min))
-
- static gInMoveWindows = false;
-
- void Swell(Rect * foo);
- void Initalize(void);
- pascal OSStatus GetWindowBounds(WindowRef window, WindowRegionCode regionCode, Rect *globalBounds);
- void MoveWindows(void);
- Boolean DoKey(int k, unsigned char gkm[16]);
-
- static SndChannelPtr theChannel = nil;
- static Handle wHandle = nil;
- static Handle dHandle = nil;
-
- // enums for routinedescriptor
- enum {
- upp_MoveWindowProcInfo = kPascalStackBased
- | STACK_ROUTINE_PARAMETER(1,kFourByteCode)
- | STACK_ROUTINE_PARAMETER(2,kTwoByteCode)
- | STACK_ROUTINE_PARAMETER(3,kTwoByteCode)
- | STACK_ROUTINE_PARAMETER(4,kOneByteCode),
- upp_SelectWindowProcInfo = kPascalStackBased
- | STACK_ROUTINE_PARAMETER(1,kFourByteCode),
- upp_SizeWindowProcInfo = kPascalStackBased
- | STACK_ROUTINE_PARAMETER(1,kFourByteCode)
- | STACK_ROUTINE_PARAMETER(2,kTwoByteCode)
- | STACK_ROUTINE_PARAMETER(3,kTwoByteCode)
- | STACK_ROUTINE_PARAMETER(4,kOneByteCode),
- uppPatcExtraInfo
- };
-
- // Function Prototypes
- extern pascal void my_MoveWindowPatch(long param1, short param2, short param3, Boolean param4);
- extern pascal void my_SelectWindowPatch(long param1);
- extern pascal void my_SizeWindowPatch(long param1, short param2, short param3, Boolean param4);
-
-
- // Globals to hold original routine descriptors
- RoutineDescriptorPtr gOriginal_MoveWindow = nil;
- RoutineDescriptorPtr gOriginal_SelectWindow = nil;
- RoutineDescriptorPtr gOriginal_SizeWindow = nil;
-
-
- // Tell MetroWerks the procInfo for main
- ProcInfoType __procinfo = kPascalStackBased;
- pascal void main(void)
- {
- RoutineDescriptorPtr originaldesc, newdesc, unImplimentedTrapAddr;
- UInt32 size;
- UInt16 index;
- THz theZone;
- Boolean good = false;
- OSErr anErr=noErr;
-
- // get globals
- EnterCodeResource();
- // detach ourselves
- srand(TickCount());
- DetachResource(Get1Resource('INIT', 0));
-
- wHandle = GetResource('snd ',128);
- if (nil != wHandle)
- DetachResource(wHandle);
-
- dHandle = GetResource('snd ',129);
- if (nil != dHandle)
- DetachResource(dHandle);
-
- // make sure we are in the system heap
- theZone = GetZone();
- SetZone(SystemZone());
- unImplimentedTrapAddr = NGetTrapAddress(_Unimplemented, (_Unimplemented & 0x0800) ? ToolTrap : OSTrap);
-
- originaldesc = NGetTrapAddress(_MoveWindow, (_MoveWindow & 0x0800) ? ToolTrap : OSTrap);
- if (originaldesc != unImplimentedTrapAddr) {
- if (originaldesc->goMixedModeTrap != _MixedModeMagic) {
- // Trap is 68K
- size = sizeof(RoutineDescriptor) + (sizeof(RoutineRecord) * 0);
- // allocate new descriptor
- newdesc = (RoutineDescriptorPtr) NewPtrSys(size);
- if (!newdesc) {
- Debugger();
- return;
- }
- // set fields of routine decscriptor
- newdesc->goMixedModeTrap = _MixedModeMagic;
- newdesc->version = 7;
- newdesc->routineDescriptorFlags = 0;
- newdesc->reserved1 = 0;
- newdesc->reserved2 = 0;
- newdesc->selectorInfo = 0;
- newdesc->routineCount = 0;
- index = 0;
- gOriginal_MoveWindow = originaldesc;
- newdesc->routineRecords[index].procInfo = upp_MoveWindowProcInfo;
- newdesc->routineRecords[index].reserved1 = 0;
- newdesc->routineRecords[index].ISA = GetCurrentArchitecture();
- newdesc->routineRecords[index].routineFlags = 4;
- newdesc->routineRecords[index].procDescriptor = (ProcPtr)my_MoveWindowPatch;
- newdesc->routineRecords[index].reserved2 = 0;
- newdesc->routineRecords[index].selector = 0;
- }
- else {
- // Trap is PPC
- size = sizeof(RoutineDescriptor) + (sizeof(RoutineRecord) * originaldesc->routineCount);
- newdesc = (RoutineDescriptorPtr) NewPtrSys(size);
- if (!newdesc) {
- DebugStr("\pFailed to allocate RoutineDescriptor");
- return;
- }
- BlockMoveData(originaldesc, newdesc, size);
- gOriginal_MoveWindow = originaldesc;
- index = 0;
- newdesc->routineRecords[index].procDescriptor = (ProcPtr)my_MoveWindowPatch;
- newdesc->routineRecords[index].ISA = GetCurrentArchitecture();
- }
- NSetTrapAddress((UniversalProcPtr) newdesc, _MoveWindow, (_MoveWindow & 0x0800) ? ToolTrap : OSTrap);
- }
-
- originaldesc = NGetTrapAddress(_SelectWindow, (_SelectWindow & 0x0800) ? ToolTrap : OSTrap);
- if (originaldesc != unImplimentedTrapAddr) {
- if (originaldesc->goMixedModeTrap != _MixedModeMagic) {
- // Trap is 68K
- size = sizeof(RoutineDescriptor) + (sizeof(RoutineRecord) * 0);
- // allocate new descriptor
- newdesc = (RoutineDescriptorPtr) NewPtrSys(size);
- if (!newdesc) {
- Debugger();
- return;
- }
- // set fields of routine decscriptor
- newdesc->goMixedModeTrap = _MixedModeMagic;
- newdesc->version = 7;
- newdesc->routineDescriptorFlags = 0;
- newdesc->reserved1 = 0;
- newdesc->reserved2 = 0;
- newdesc->selectorInfo = 0;
- newdesc->routineCount = 0;
- index = 0;
- gOriginal_SelectWindow = originaldesc;
- newdesc->routineRecords[index].procInfo = upp_SelectWindowProcInfo;
- newdesc->routineRecords[index].reserved1 = 0;
- newdesc->routineRecords[index].ISA = GetCurrentArchitecture();
- newdesc->routineRecords[index].routineFlags = 4;
- newdesc->routineRecords[index].procDescriptor = (ProcPtr)my_SelectWindowPatch;
- newdesc->routineRecords[index].reserved2 = 0;
- newdesc->routineRecords[index].selector = 0;
- }
- else {
- // Trap is PPC
- size = sizeof(RoutineDescriptor) + (sizeof(RoutineRecord) * originaldesc->routineCount);
- newdesc = (RoutineDescriptorPtr) NewPtrSys(size);
- if (!newdesc) {
- DebugStr("\pFailed to allocate RoutineDescriptor");
- return;
- }
- BlockMoveData(originaldesc, newdesc, size);
- gOriginal_SelectWindow = originaldesc;
- index = 0;
- newdesc->routineRecords[index].procDescriptor = (ProcPtr)my_SelectWindowPatch;
- newdesc->routineRecords[index].ISA = GetCurrentArchitecture();
- }
- NSetTrapAddress((UniversalProcPtr) newdesc, _SelectWindow, (_SelectWindow & 0x0800) ? ToolTrap : OSTrap);
- }
- originaldesc = NGetTrapAddress(_SizeWindow, (_SizeWindow & 0x0800) ? ToolTrap : OSTrap);
- if (originaldesc != unImplimentedTrapAddr) {
- if (originaldesc->goMixedModeTrap != _MixedModeMagic) {
- // Trap is 68K
- size = sizeof(RoutineDescriptor) + (sizeof(RoutineRecord) * 0);
- // allocate new descriptor
- newdesc = (RoutineDescriptorPtr) NewPtrSys(size);
- if (!newdesc) {
- Debugger();
- return;
- }
- // set fields of routine decscriptor
- newdesc->goMixedModeTrap = _MixedModeMagic;
- newdesc->version = 7;
- newdesc->routineDescriptorFlags = 0;
- newdesc->reserved1 = 0;
- newdesc->reserved2 = 0;
- newdesc->selectorInfo = 0;
- newdesc->routineCount = 0;
- index = 0;
- gOriginal_SizeWindow = originaldesc;
- newdesc->routineRecords[index].procInfo = upp_SizeWindowProcInfo;
- newdesc->routineRecords[index].reserved1 = 0;
- newdesc->routineRecords[index].ISA = GetCurrentArchitecture();
- newdesc->routineRecords[index].routineFlags = 4;
- newdesc->routineRecords[index].procDescriptor = (ProcPtr)my_SizeWindowPatch;
- newdesc->routineRecords[index].reserved2 = 0;
- newdesc->routineRecords[index].selector = 0;
- }
- else {
- // Trap is PPC
- size = sizeof(RoutineDescriptor) + (sizeof(RoutineRecord) * originaldesc->routineCount);
- newdesc = (RoutineDescriptorPtr) NewPtrSys(size);
- if (!newdesc) {
- DebugStr("\pFailed to allocate RoutineDescriptor");
- return;
- }
- BlockMoveData(originaldesc, newdesc, size);
- gOriginal_SizeWindow = originaldesc;
- index = 0;
- newdesc->routineRecords[index].procDescriptor = (ProcPtr)my_SizeWindowPatch;
- newdesc->routineRecords[index].ISA = GetCurrentArchitecture();
- }
- NSetTrapAddress((UniversalProcPtr) newdesc, _SizeWindow, (_SizeWindow & 0x0800) ? ToolTrap : OSTrap);
-
- good = true;
- }
-
- if (good)
- {
- ShowInitIcon(128, true);
- if (theChannel && wHandle)
- {
- anErr = SndPlay(theChannel, (SndListHandle) wHandle, false);
- anErr = SndPlay(theChannel, (SndListHandle) wHandle, false);
- if (noErr != anErr)
- DebugStr("\p|SndPlay error:?.;");
- }
- }
- else
- {
- ShowInitIcon(129, true);
- if (theChannel && dHandle)
- {
- anErr = SndPlay(theChannel, (SndListHandle) dHandle, false);
- if (noErr != anErr)
- DebugStr("\p|SndPlay error:?.;");
- }
- }
- // restore to original heap
- SetZone(theZone);
- // restore globals
- ExitCodeResource();
- }
-
- pascal OSStatus GetWindowBounds(WindowRef window,
- WindowRegionCode regionCode,Rect *globalBounds)
- {
- OSStatus anErr = noErr;
- // GrafPtr savePort;
- Rect tRect;
-
- (regionCode);
-
- // GetPort(&savePort);
- // SetPort(window);
-
- tRect = (*((WindowPeek) window)->contRgn)->rgnBBox;
-
- if (nil != globalBounds)
- *globalBounds = tRect;
- else
- anErr = paramErr;
-
- // SetPort(savePort);
-
- return anErr;
- }
-
- void Swell(Rect * swellee)
- {
- swellee->left -= kSwell;
- if (swellee->left < 0)
- swellee->left = 1;
-
- swellee->right += kSwell;
- swellee->top -= kSwell/2;
- if (swellee->top < 0)
- swellee->top = 1;
-
- swellee->bottom += kSwell*2;
- }
-
- void MoveWindows(void)
- {
- WindowPeek baseWindow;
- Rect wRect = { 20,20,200,820}, mainRect;
- GDHandle tGDHandle = LMGetMainDevice();
- PixMapHandle tPixMapHdl = (*tGDHandle)->gdPMap;
- Rect sRect = (*tPixMapHdl)->bounds;
- short d1=0;
- unsigned char map[16];
- OSErr anErr = noErr;
-
- GetKeys((unsigned long *)map);
- if(DoKey(56, map))
- return;
-
- if (gInMoveWindows)
- return;
- gInMoveWindows = true;
-
- baseWindow = (WindowPeek) LMGetWindowList();
- if (nil == baseWindow)
- {
- gInMoveWindows = false;
- return;
- }
-
- #if 1
- if (nil == theChannel)
- {
- // DebugStr("\p|Before SndNewChannel-I-Debug;");
- anErr = SndNewChannel(&theChannel, sampledSynth, initStereo, NULL);
- if (noErr != anErr)
- DebugStr("\p|SndNewChannel error:?.;");
- }
-
- if (theChannel && wHandle)
- {
- anErr = SndPlay(theChannel, (SndListHandle) wHandle, false);
- // anErr = SndPlay(theChannel, (SndListHandle) wHandle, false);
- if (noErr != anErr)
- DebugStr("\p|SndPlay error:?.;");
- }
- // if (theChannel && dHandle)
- // SndPlay(theChannel, (SndListHandle)dHandle, true);
- #endif
-
- (void) GetWindowBounds((WindowPtr) baseWindow,kWindowGlobalPortRgn,&mainRect);
- Swell(&mainRect);
-
- while (nil != baseWindow)
- {
- Point tDelta;
- short direction=0, whichy = Rand(0,3);
- Rect tRect;
- baseWindow = baseWindow->nextWindow;
- if (nil==baseWindow)
- {
- gInMoveWindows = false;
- return;
- }
-
- (void) GetWindowBounds((WindowPtr) baseWindow,kWindowGlobalPortRgn,&wRect);
-
- while(SectRect(&mainRect, &wRect, nil))
- {
- tDelta.h = tDelta.v = 0;
- switch(whichy)
- {
- case 0:
- {
- switch(direction)
- {
- case 0:
- case 4:
- tDelta.h=kHOffset;
- break;
- case 1:
- case 5:
- tDelta.v=-kVOffset;
- break;
- case 2:
- case 6:
- tDelta.h=-kHOffset;
- break;
- case 3:
- case 7:
- tDelta.v=kVOffset;
- break;
- case 8:
- tDelta.v=kVOffset;
- tDelta.h=kHOffset;
- break;
- }
- }
- break;
-
- case 1:
- {
- switch(direction)
- {
- case 0:
- case 4:
- tDelta.h=-kHOffset;
- break;
- case 1:
- case 5:
- tDelta.v=kVOffset;
- break;
- case 2:
- case 6:
- tDelta.h=kHOffset;
- break;
- case 3:
- case 7:
- tDelta.v=-kVOffset;
- break;
- case 8:
- tDelta.v=-kVOffset;
- tDelta.h=-kHOffset;
- break;
- }
- }
- break;
-
- case 2:
- {
- switch(direction)
- {
- case 0:
- case 4:
- tDelta.v=kVOffset;
- tDelta.h=kHOffset;
- break;
- case 1:
- case 5:
- tDelta.v=-kVOffset;
- break;
- case 2:
- case 6:
- tDelta.v=kVOffset;
- tDelta.h=-kHOffset;
- break;
- case 3:
- case 7:
- tDelta.v=-kVOffset;
- break;
- case 8:
- tDelta.h=kHOffset;
- break;
- }
- }
- break;
-
- case 3:
- {
- switch(direction)
- {
- case 0:
- case 4:
- tDelta.v=kVOffset;
- tDelta.h=kHOffset;
- break;
- case 1:
- case 5:
- tDelta.v=kVOffset;
- tDelta.h=-kHOffset;
- break;
- case 2:
- case 6:
- tDelta.v=-kVOffset;
- tDelta.h=-kHOffset;
- break;
- case 3:
- case 7:
- tDelta.v=-kVOffset;
- tDelta.h=kHOffset;
- break;
- case 8:
- tDelta.h=-kHOffset;
- break;
- }
- break;
- }
- default:
- Debugger();
- }
- // tDelta.h += Rand(-3,3);
- // tDelta.v += Rand(-2,2);
- GetKeys((unsigned long *)map);
- if(DoKey(56, map))
- {
- gInMoveWindows = false;
- return;
- }
- OffsetRect(&wRect,tDelta.h,tDelta.v);
- MoveWindow((WindowPtr)baseWindow, wRect.left, wRect.top, false);
- // CALL_FOUR_PARAMETER_UPP( gOriginal_MoveWindow, upp_MoveWindowProcInfo, (WindowPtr)baseWindow, wRect.left, wRect.top, false);
- // (void) GetWindowBounds((WindowPtr) baseWindow,kWindowGlobalPortRgn,&wRect);
-
- SectRect(&sRect, &wRect, &tRect);
- if (!EqualRect(&wRect, &tRect))
- {
- MoveWindow((WindowPtr)baseWindow, wRect.left - tDelta.h, wRect.top - tDelta.v, false);
- direction++;
- (void) GetWindowBounds((WindowPtr) baseWindow,kWindowGlobalPortRgn,&wRect);
- }
- if (direction > 8)
- break;
- }
- }
- gInMoveWindows = false;
- }
-
- pascal void my_SelectWindowPatch(long param1)
- {
- // Get globals
- EnterCodeResource();
-
- // DebugStr("\p|my_SelectWindowPatch-I-Debug;");
-
- CALL_ONE_PARAMETER_UPP( gOriginal_SelectWindow, upp_SelectWindowProcInfo, param1);
- MoveWindows();
- // gInMoveWindows = false;
- // Release globals
- ExitCodeResource();
- }
-
-
- pascal void my_MoveWindowPatch(long param1, short param2, short param3, Boolean param4)
- {
- // Get globals
- EnterCodeResource();
-
- CALL_FOUR_PARAMETER_UPP( gOriginal_MoveWindow, upp_MoveWindowProcInfo, param1, param2, param3, param4);
- MoveWindows();
- // gInMoveWindows = false;
- // Release globals
- ExitCodeResource();
- }
-
- pascal void my_SizeWindowPatch(long param1, short param2, short param3, Boolean param4)
- {
- // Get globals
- EnterCodeResource();
-
- CALL_FOUR_PARAMETER_UPP( gOriginal_SizeWindow, upp_SizeWindowProcInfo, param1, param2, param3, param4);
- MoveWindows();
-
- // Release globals
- ExitCodeResource();
- }
-
- Boolean DoKey(int k, unsigned char gkm[16])
- {
- return((gkm[k>>3]>>(k&7))&1);
- }